package com.itplh.modules.ehcache.service;

import com.itplh.modules.mybatisplus.pojo.MybatisPlusUserEntity;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;

/**
 * @Description: spring cache abstraction使用
 * @Author: tanpeng
 * @Date: 2019-07-10 22:15
 * @Version: V1.0
 */
@CacheConfig(cacheNames="hello-world-spring-boot-cache") // 声明缓存使用的缓存名称
public interface EhcacheUserService {

    /**
     * 配置这个函数的返回值加入到缓存中，查询的时候先从缓存中获取，如果不存在再去数据库中查询。
     * 除了@Cacheable，还有 @CachePut 和 @CacheEvict。
     * @CachePut 它每次都会调用函数，所以主要用于数据库新增和修改上。
     * @CacheEvict 配置函数上，通常用在删除方法上，用来从缓存中移除相应数据。
     *
     * @param id
     * @return
     */
    @Cacheable
    MybatisPlusUserEntity findById(Integer id);

    /**
     * 在spring boot中通过 @EnableCaching 注解自动化配置合适的缓存管理器。
     * Generic、JCache、EhCache。。。reids
     * spring.chache.type强制指定缓存管理器。
     * 可以直接在resources下配置ehcache.xml，spring boot会自己侦测到。
     * 但是为了后期的演示，我们将其放到config文件夹中，并且改名为ehcache-config.xml,然后配置
     * 指定这个xml :spring.cache.ehchache.config=classpath:cofnig/ehcache-config.xml
     *
     * @param user
     * @return
     */
    @CachePut
    int save(MybatisPlusUserEntity user);

    @CacheEvict
    int delete(Integer id);
}
